package br.com.saeng2D.superficie.select;

import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;

import br.com.saeng2D.objeto.AbstratoObjeto;
import br.com.saeng2D.objeto.forca.AbstratoForca;
import br.com.saeng2D.objeto.forca.ForcaCentralizada;
import br.com.saeng2D.objeto.forca.ForcaCentralizada2;
import br.com.saeng2D.objeto.forca.ForcaMomento;
import br.com.saeng2D.objeto.linha.Linha;
import br.com.saeng2D.superficie.Superficie;

public class SelecionadorStateMomento extends SelecionadorState {

	private List<AbstratoObjeto> adicionados = new ArrayList<AbstratoObjeto>();
	private List<AbstratoForca> forcasAdicionadas = new ArrayList<AbstratoForca>();
	private List<String> acumulados = new ArrayList<String>();
	private int xApoio;
	private int yApoio;

	public SelecionadorStateMomento(SelecionadorSuperficieClone selecionadorSuperficieClone,int xApoio,int yApoio) {
		super(selecionadorSuperficieClone);
		this.xApoio = xApoio;
		this.yApoio = yApoio;
	}

	public void processarPonto(Superficie superficie, MouseEvent e) {
	}
	
	public void processarSomatorioX(Superficie superficie, MouseEvent e) {
	}

	public void processarSomatorioY(Superficie superficie, MouseEvent e) {
	}

	public void processarSomatorioMomento(Superficie superficie, MouseEvent e) {
		int x = e.getX();
		int y = e.getY();
		for (AbstratoObjeto objeto : superficie.getObjetos()) {
			if(objeto instanceof ForcaCentralizada) {
				ForcaCentralizada forcaCentralizada = (ForcaCentralizada) objeto;
				forcaCentralizada.setSelecionado(false);
				if(!adicionados.contains(objeto)) {
					if(forcaCentralizada.estarSob(x, y) && forcaCentralizada.estaNaHorizontal()) {
						forcaCentralizada.setSelecionado(true);
						forcaCentralizada.setOrientacao(false);
						acumulados.add(forcaCentralizada.getVariavelForca());
						forcasAdicionadas.add((AbstratoForca) objeto);
						superficie.getFormularioPrincipal().acumularMomento(xApoio,yApoio,forcasAdicionadas);
						adicionados.add(objeto);
					}else if(forcaCentralizada.estarSob(x, y) && forcaCentralizada.estaNaVertical()) {
						forcaCentralizada.setSelecionado(true);
						forcaCentralizada.setOrientacao(true);
						acumulados.add(forcaCentralizada.getVariavelForca());
						forcasAdicionadas.add((AbstratoForca) objeto);
						superficie.getFormularioPrincipal().acumularMomento(xApoio,yApoio,forcasAdicionadas);
						adicionados.add(objeto);
					}
				}
			} else if(objeto instanceof ForcaCentralizada2) {
				ForcaCentralizada2 forcaCentralizada2 = (ForcaCentralizada2) objeto;
				forcaCentralizada2.setSelecionado(false);
				int xf = forcaCentralizada2.getX();
				int yf = forcaCentralizada2.getY();
				double grauInclinacao = 0;
				for(AbstratoObjeto obj:superficie.getObjetos()){
					if(obj instanceof Linha){
						Linha linha = (Linha)obj;
						if(linha.estarSob(xf, yf)){
							grauInclinacao = linha.getGrauInclinacao();
						}
					}
				}
				
				if(!adicionados.contains(objeto)) {
					if(forcaCentralizada2.estarSob(x, y)&& grauInclinacao!=90.0 && grauInclinacao!=0 && grauInclinacao!=180.0&& grauInclinacao!=270.0) {
						forcaCentralizada2.setSelecionado(true);
						acumulados.add(forcaCentralizada2.getVariavelForca());
						List<ForcaCentralizada> forcasEquivalentes = forcaCentralizada2.forcaNaDiagonal(grauInclinacao,forcaCentralizada2.getVariavelForca());
						for(ForcaCentralizada forcEqui:forcasEquivalentes){
							forcasAdicionadas.add(forcEqui);
						}
						//forcasAdicionadas.add((AbstratoForca) objeto);
						superficie.getFormularioPrincipal().acumularMomento(xApoio,yApoio,forcasAdicionadas);					
						adicionados.add(objeto);
					}else if(forcaCentralizada2.estarSob(x, y) && forcaCentralizada2.estaNaHorizontal()) {
							forcaCentralizada2.setSelecionado(true);
							forcaCentralizada2.setOrientacao(false);
							acumulados.add(forcaCentralizada2.getVariavelForca());
							forcasAdicionadas.add((AbstratoForca) objeto);
							superficie.getFormularioPrincipal().acumularMomento(xApoio,yApoio,forcasAdicionadas);					
							adicionados.add(objeto);
					}else if(forcaCentralizada2.estarSob(x, y) && forcaCentralizada2.estaNaVertical()) {
						forcaCentralizada2.setSelecionado(true);
						forcaCentralizada2.setOrientacao(true);
						acumulados.add(forcaCentralizada2.getVariavelForca());
						forcasAdicionadas.add((AbstratoForca) objeto);
						superficie.getFormularioPrincipal().acumularMomento(xApoio,yApoio,forcasAdicionadas);
						adicionados.add(objeto);
					}
				}
			}else if(objeto instanceof ForcaMomento){
				ForcaMomento forcaMomento = (ForcaMomento)objeto;
				forcaMomento.setSelecionado(false);
				if(!adicionados.contains(objeto)) {
					if(forcaMomento.estarSob(x, y) && forcaMomento.retornaSentido()) {
						forcaMomento.setSelecionado(true);
						acumulados.add(forcaMomento.getVariavelForca());
						forcasAdicionadas.add((AbstratoForca) objeto);
						superficie.getFormularioPrincipal().acumularMomento(xApoio,yApoio,forcasAdicionadas);
						adicionados.add(objeto);
					}else if(forcaMomento.estarSob(x, y) && forcaMomento.retornaSentido()==false) {
						forcaMomento.setSelecionado(true);
						acumulados.add(forcaMomento.getVariavelForca());
						forcasAdicionadas.add((AbstratoForca) objeto);
						superficie.getFormularioPrincipal().acumularMomento(xApoio,yApoio,forcasAdicionadas);
						adicionados.add(objeto);
					}
				}	
			}
		}
		superficie.repaint();			
		
	}
}